const createLogs = require('@/utils/logs')
const logger = createLogs()

/**
 * 全面的错误处理中间件
 * @param {Error} err - 错误对象
 * @param {Object} req - 请求对象
 * @param {Object} res - 响应对象
 * @param {Function} next - 下一个中间件函数
 */
const errorHandler = (err, req, res, next) => {
  // /serviceWorker.js似乎是浏览器插件
  let whiteList = ["/serviceWorker.js"]
  if (whiteList.includes(req.url)) {
    next();
    return
  }
  // 记录错误
  logger.error(`Error in request to ${req.url}`, { error: err });

  let statusCode = err.status || 500;
  let message = err.message || 'Internal Server Error';

  // 根据环境返回不同的错误信息
  // 处理Joi验证错误
  if (err.isJoi) {
    statusCode = 400;
    message = 'Validation failed';
    const details = err.details.map(detail => detail.message);
    res.status(statusCode).json({
      message,
      errors: details,
      code: 400
    });
  } else {
    if (process.env.NODE_ENV === 'development') {
      // 开发模式下返回详细错误信息
      res.status(statusCode).json({
        message,
        stack: err.stack,
        // error: err,
        code: statusCode
      });
    } else {
      // 生产模式下只返回简单的错误信息
      res.status(statusCode).json({
        message,
        code: statusCode
      });
    }
  }

  // 调用下一个中间件（如果有的话）
  next();
};

// 使用示例
// app.get('/api/users', async (req, res, next) => {
//   try {
//     const users = await db.getUsers();
//     res.json(users);
//   } catch (error) {
//     // 数据库查询失败，触发错误处理中间件
//     const err = new Error('Database query failed');
//     err.status = 500;
//     next(err);
//   }
// });

module.exports = errorHandler;